#pragma once

#include <drogon/drogon.h>
#include <drogon/HttpFilter.h>

#include <regex>

#include "utils/response.h"
#include "plugins/plugin_KeyManagerPlugin.h"

using namespace drogon;

template<class T>
class [[maybe_unused]] AuthFilter : public HttpFilter<T> {
public:
    [[maybe_unused]] void doFilter(
            const HttpRequestPtr &req,
            FilterCallback &&fcb,
            FilterChainCallback &&fccb
    ) override {
        // 创建json响应对象
        auto response = HttpResponse::newHttpJsonResponse(response::InvalidParametersResponse());
        response->setStatusCode(k403Forbidden);

        // 获取请求体的JSON对象
        auto json = req->jsonObject();
        // 检查JSON对象是否为空
        if (!json) {
            fcb(response);
            return;
        }

        // 检查JSON对象是否包含account、username和password字段
        if (!json->isMember("account") || !json->isMember("password")) {
            fcb(response);
            return;
        }

        // 获取account字段的值
        std::string account = json->get("account", "").asString();

        // 使用正则表达式验证account字段的值
        std::regex pattern("^(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9@_.]{8,20}$");
        if (!std::regex_match(account, pattern)) {
            fcb(response);
            return;
        }

        // 获取password字段的值
        std::string password = json->get("password", "").asString();

        // 使用正则表达式验证password字段的值
        std::regex pattern_password("^[a-zA-Z0-9+/]*={0,2}$");
        if (!std::regex_match(password, pattern_password)) {
            fcb(response);
            return;
        }

        // 获取插件
        auto keyManager = app().getPlugin<KeyManagerPlugin>();
        // 解密
        auto dePassword = keyManager->rsaDecrypt(password);
        // 检查解密结果
        if (dePassword.empty()) {
            fcb(response);
            return;
        }
        // 覆盖password字段的值
        (*json)["password"] = dePassword;

        // 如果所有检查都通过，则接受请求
        fccb();
    }
};
